<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script src="../js/ajax.js"></script>
</head>

<body>

</body>
<script>
    // Promise 的含义
    // Promise 是异步编程的一种解决方案  (本质还是异步 只是结构 和 执行流程更加清晰)

    // 所谓Promise，简单说就是一个容器，里面保存着某个未来才会结束的事件（通常是一个异步操作）的结果,只有异步操作的结果，可以决定当前是哪一种状态(用户自己定义) => 执行不同的操作

    // 举例说明
    // Promise => 承诺 => ? 从许下承诺  到  有结果 需要经历那些过程

    // Promise的状态
    // pending (进行中)  此时异步操作没有结果
    // fulfilled(已成功   resolved)
    // rejectd (已失败)

    // Promise的特点:

    // 1. 对象的状态不受外界影响 => 想要改变状态 需要借助   resolve(), reject()  方法
    // resolve()  => pending(进行中状态) => fulfilled(已成功)
    // reject()  => pending(进行中状态) => rejected(已失败)
    // resolve() reject() 除了可以改变状态 还可以 传递数据 

    // 2. Promise 对象 的状态一经改变  不能再次改变
    // 一旦状态改变，就不会再变，任何时候都可以得到这个结果。Promise对象的状态改变，只有两种可能：从pending变为fulfilled和从pending变为rejected。只要这两种情况发生，状态就凝固了，不会再变了，会一直保持这个结果，这时就称为 resolved（已定型

    // 创建了一个Promise实例(p)   判断用户名是否存在 => 不存在:可用  存在:不可以  对应结果改变状态,并将detail传递出去
    // 经由构造函数创建出来的对象  叫做实例化对象


    console.log("开始执行");

    var p = new Promise(function (resolve, reject) { //容器 => 放异步代码(加载时立即执行)
        console.log("同步代码");
        $.ajax({
            url: "../php/isExist.php",
            data: {
                user: 'a123123',
            },
            dataType: "json",
            success: function (result) {
                console.log("result", result);
                var { status, detail } = result;
                if (status) {
                    resolve(detail);
                } else {
                    reject(detail);  //以抛错的形势改变状态的
                }
                console.log(p);
            }
        })
    })

    console.log("代码执行完毕:", p);

    // Promise的常用方法(给Promise实例(p) 用的)
    // p.then(callback1, callback2);   提前规定好了状态改变时执行的回调函数
    // callback1  当Prmise实例 由 pending(进行中状态) => fulfilled(已成功) 执行此回调函数  
    // callback2  当Prmise实例 由 pending(进行中状态) => rejected(已失败)  执行此回调函数  

    // p.then(function (arg) {
    //     console.log("test", 1111111, arg);
    // }, function (arg) {
    //     console.log("test", 2222222, arg);
    // })





</script>

</html>